#include "FenDeroulementJeuResaux.h"

#ifndef  WIN32
	#include <unistd.h>
#endif
FenDeroulementJeuResaux::FenDeroulementJeuResaux(SDL_Surface *ecran , Client* s ,  bool createur) : Fenetre("resaux" , ecran ){
    this->cli = s;
    this->cli->persistant();

    this->createur = createur;

    initialisation();
}

void FenDeroulementJeuResaux::initialisation(){
    gene = new GenerateurResaux(ecran);
    cout << "dans le fonction initialisation" << endl;
    //attente du nombre de joueur et en suite on va recuperer leurs nom
    char taille;
    int lu ;
    cout << "on recoi le premier message du client " << endl;
    cli->recevoirMessage(&taille , sizeof(char) , &lu);

    if(lu == -1){
        Fenetre::afficherMessage("initialisation >> erreur le serveur a couper");
    }

    int i = 0;
    for(i = 0 ; i < (int) taille && i < 8 ; i++){
        char tailleNom;
        //on va lire la taille du nom
        cli->recevoirMessage(&tailleNom , sizeof(char) , &lu);

        char* nom = new char[tailleNom+1];

        cli->recevoirMessage(nom , tailleNom+1 , &lu);
        //on va simplement afficher les piont les uns au dessu des autres
        Position pos;
        pos.x = (i+1)*32;
        pos.y = ecran->h - 32;

        joueurs[i] = new Pion(ecran ,"ressources/images/pion.bmp" ,  "ressources/images/pion2.bmp",pos ,(string)nom );
        if(cli->getNom() == (string)nom)
            moi = joueurs[i];
    }
    for(;i < (int)taille ; i++)
        joueurs[i] =NULL;

    nombreDeJoueur = (int) taille;

    cout << "on a recu tout les joueurs " << nombreDeJoueur << endl;
    //on va recevoir toute les plateForme
    //on recoi dabord le nombre de plateForme
    char code;
    cli->recevoirMessage(&code , sizeof(char) , &lu);

    if(lu == -1){
         Fenetre::afficherMessage("initialisation >> erreur le serveur a couper");
         exit(1);
    }
    cout << "on a recu le code " << (int)code  << " on a lut " << lu << " octet" << endl;
    if(code == 107){//si on nous envoi la map
        char nbPlateForme;
        cli->recevoirMessage(&nbPlateForme , sizeof(char) , &lu);
        if(lu == -1){
             Fenetre::afficherMessage("initialisation >> erreur le serveur a couper");
             exit(1);
        }
        cout << "on lit la plate forme" << endl;
        for(int i = 0 ; i < (int) nbPlateForme ; i++){
            int numeroCube = lireEntier() ;
            int plateFormeAssoc = lireEntier();
            SDL_Rect position;
            position.x = lireEntier();
            position.y = lireEntier();
            gene->ajouterPlateForme(numeroCube , plateFormeAssoc , position);
            cout << "on donne au generateur : " << numeroCube <<", " << plateFormeAssoc << "," <<  position.x << "," << position.y << endl;
        }
    }else if(code == 0){
        cli->recevoirMessage(&code , sizeof(char) , &lu);
        cout << "erreur >> on a  le code a 0 , et on a pu lire :" << (int)code << endl;
    }

    cout << "fin de la fonction d'initialisation" << endl;
}

int FenDeroulementJeuResaux::lireEntier(){
    //on va lire la taille de l'entier
    char tailleNumBloc;
    int lu;
    cli->recevoirMessage(&tailleNumBloc , sizeof(char) , &lu);//on lit ca taille
    int tailleNum = tailleNumBloc-'0';//on converti ca taille en entier
    char* numBloc = new char[tailleNumBloc+1];//on crer un variable pour retenir la valeur de l'entier
    cli->recevoirMessage(numBloc , (tailleNumBloc+1)*tailleNum, &lu);
    numBloc[tailleNumBloc] = '\0';
    return atoi(numBloc);
}

 void FenDeroulementJeuResaux::miseAJour(){
    char code;
    int lu ;
    cli->recevoirMessage(&code , sizeof(char) , &lu);
    if(lu == -1)return;
    if(code == 42){
        Fenetre::afficherMessage("erreur le serveur a quitter le jeu");
        exit(1);
    }else if(code == 108){
        char info[2];
       cli->recevoirMessage(info , sizeof(info) , &lu);
        if(lu == -1)return;

        if(joueurs[(int)(info[1])] != NULL && joueurs[(int)(info[1])] != moi)
        {
            if(info[0] == 1)
                joueurs[(int)(info[1])]->deplacer(DROITE);
            else if(info[0] == 2)
                joueurs[(int)(info[1])]->deplacer(GAUCHE);
        }
    }
}

void FenDeroulementJeuResaux::afficher(){
    bool fin = false;
    SDL_Event event;

    cli->nonPersistant();

    while(!fin){
        Uint8 *keystate = SDL_GetKeyState(NULL);
        if(keystate[SDLK_RIGHT]){
            moi->deplacer(DROITE);
            char envoi[2];
            envoi[0] = 108;//code du deplacement
            envoi[1] = 1;
            cli->envoyerMessage(envoi , sizeof(envoi));
        }
        if(keystate[SDLK_LEFT]){
            moi->deplacer(GAUCHE);
            char envoi[2];
            envoi[0] = 108;//code du deplacement
            envoi[1] = 2;
            cli->envoyerMessage(envoi , sizeof(envoi));
        }

        SDL_PollEvent(&event);
        Fenetre::afficher();
        switch(event.type){
            case SDL_QUIT :
                exit(1);
            break;

        }

        miseAJour();

        gene->afficher();
        //on va afficher tout les joueurs
        for(int i = 0 ; i < nombreDeJoueur ; i++)
        {
            joueurs[i]->calculerPosition(gene->getTabC() , vector<Monstre*>(), vector<Accessoir*>());
            joueurs[i]->afficher();
        }

        SDL_Flip(ecran);
    }


}
